using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; namespace SuperPolarity { class MainShip : Ship { public static Color BlueColor; public static Color RedColor; ParticleEngine particleEngine; protected bool Shooting; protected int ShotCooldown; public MainShip(Game newGame) : base(newGame) {} ~MainShip() { particleEngine = null; } public override void Initialize(Texture2D texture, Vector2 position) { base.Initialize(texture, position); MainShip.BlueColor = new Color(230, 244, 249); MainShip.RedColor = new Color(255, 234, 241); InitParticleEngine(); SetPolarity(Polarity.Positive); ShotCooldown = 50; BindInput(); } void InitParticleEngine() { particleEngine = ParticleEffectFactory.CreatePolarCircle(Position); } void BindInput() { InputController.Bind("moveX", HandleHorizontalMovement); InputController.Bind("moveY", HandleVerticalMovement); InputController.Bind("changePolarity", HandleChangePolarity); InputController.Bind("shoot", HandleShot); } protected void HandleShot(float value) { Children.Add(ActorFactory.CreateBullet(Position, Angle)); Shooting = true; Timer t = new Timer(new TimerCallback(UnlockShot)); t.Change(ShotCooldown, Timeout.Infinite); } protected void UnlockShot(object state) { InputController.Unlock("shoot"); } protected void HandleChangePolarity(float value) { SwitchPolarity(); } public void HandleHorizontalMovement(float value) { Acceleration.X = value * AccelerationRate; if (value > 0.1 && Velocity.X < 0 || value < 0.1 && Velocity.X > 0) { Acceleration.X *= 2; } if (value > 0.1 && Velocity.Y < 0 || value < 0.1 && Velocity.Y > 0) { Acceleration.Y *= 2; } } public void HandleVerticalMovement(float value) { Acceleration.Y = value * AccelerationRate; } public override void SwitchPolarity() { base.SwitchPolarity(); SwitchParticleEngine(CurrentPolarity); } public override void SetPolarity(Polarity newPolarity) { base.SetPolarity(newPolarity); SwitchParticleEngine(newPolarity); } protected void SwitchParticleEngine(Polarity polarity) { if (polarity == Polarity.Positive) { particleEngine.Color = MainShip.RedColor; } else if (polarity == Polarity.Negative) { particleEngine.Color = MainShip.BlueColor; } else { particleEngine.Color = Color.Gray; } } public override void Update(GameTime gameTime) { base.Update(gameTime); particleEngine.EmitterLocation = Position; particleEngine.Update(); ConstrainToEdges(); Shooting = false; } public override void Move(GameTime gameTime) { base.Move(gameTime); if (Shooting) { if (Velocity.X > ActVelocity) { Velocity.X = ActVelocity; } if (Velocity.X < -ActVelocity) { Velocity.X = -ActVelocity; } if (Velocity.Y > ActVelocity) { Velocity.Y = ActVelocity; } if (Velocity.Y < -ActVelocity) { Velocity.Y = -ActVelocity; } } } public override void Magnetize(Ship ship, float distance, float angle) { } protected void ConstrainToEdges() { if (Position.X < 0) { Position.X = 0; if (Velocity.X < 0) { Velocity.X = 0; } } if (Position.X > game.GraphicsDevice.Viewport.Width) { Position.X = game.GraphicsDevice.Viewport.Width; if (Velocity.X > 0) { Velocity.X = 0; } } if (Position.Y < 0) { Position.Y = 0; if (Velocity.Y < 0) { Velocity.Y = 0; } } if (Position.Y > game.GraphicsDevice.Viewport.Height) { Position.Y = game.GraphicsDevice.Viewport.Height; if (Velocity.Y < 0) { Velocity.Y = 0; } } } public override void Draw(SpriteBatch spriteBatch) { particleEngine.Draw(spriteBatch); base.Draw(spriteBatch); } } }